home *** CD-ROM | disk | FTP | other *** search
/ The Atari Compendium / The Atari Compendium (Toad Computers) (1994).iso / files / prgtools / gnustuff / minix / update~3.z / update~3 / lib_diffs < prev    next >
Encoding:
Text File  |  1989-09-05  |  24.9 KB  |  1,020 lines

  1. *** /tmp/,RCSt1a22974    Thu Aug 31 20:57:45 1989
  2. --- Makefile.16    Thu Aug 31 20:56:14 1989
  3. ***************
  4. *** 50,56 ****
  5.             execlp.o cuserid.o ctermid.o bsearch.o brk2.o mkfifo.o
  6.   
  7.   GNUSUPPORT = \
  8. ! _umulsi3.o _mulsi3.o _udivsi3.o _divsi3.o _umodsi3.o _modsi3.o \
  9.   _addsf3.o _negsf2.o _subsf3.o _cmpsf2.o _mulsf3.o _divsf3.o \
  10.   _divdf3.o _muldf3.o _negdf2.o _adddf3.o _subdf3.o _cmpdf2.o \
  11.   _fixunsdfsi.o _fixunsdfdi.o _fixdfdi.o _floatsidf.o _floatdidf.o \
  12. --- 50,56 ----
  13.             execlp.o cuserid.o ctermid.o bsearch.o brk2.o mkfifo.o
  14.   
  15.   GNUSUPPORT = \
  16. ! fixnum.o \
  17.   _addsf3.o _negsf2.o _subsf3.o _cmpsf2.o _mulsf3.o _divsf3.o \
  18.   _divdf3.o _muldf3.o _negdf2.o _adddf3.o _subdf3.o _cmpdf2.o \
  19.   _fixunsdfsi.o _fixunsdfdi.o _fixdfdi.o _floatsidf.o _floatdidf.o \
  20. ***************
  21. *** 76,82 ****
  22.       rm -f $(GNUSTUFF) fixnumMade sflonumMade dflonumMade
  23.       rm -f $(SFILES)
  24.       rm -f $(O14)
  25. !     rm -f $(O12) ivfprintf.o
  26.   
  27.   libc.a:    $(O1) $(O2) $(O3) $(O4) $(O5) $(O6) $(GNUSTUFF) $(O14) $(O12)
  28.       rm -f $@
  29. --- 76,82 ----
  30.       rm -f $(GNUSTUFF) fixnumMade sflonumMade dflonumMade
  31.       rm -f $(SFILES)
  32.       rm -f $(O14)
  33. !     rm -f $(O12) ivfprintf.o iscanf.o
  34.   
  35.   libc.a:    $(O1) $(O2) $(O3) $(O4) $(O5) $(O6) $(GNUSTUFF) $(O14) $(O12)
  36.       rm -f $@
  37. ***************
  38. *** 135,150 ****
  39.       $(CC) -O -DATARI_ST -c atof.c -DNDEBUG \
  40.         -fomit-frame-pointer  -fcombine-regs -fstrength-reduce
  41.   
  42. ! _umulsi3.o _mulsi3.o _udivsi3.o _divsi3.o _umodsi3.o _modsi3.o : fixnumMade
  43. ! fixnumMade : fixnum.s
  44. !     for name in _umulsi3 _mulsi3 _udivsi3 _divsi3 _umodsi3 _modsi3 ; \
  45. !     do \
  46. !     echo $${name}; \
  47. !     $(CPP) -P -DL$${name} -D__GNUC__ -D__MSHORT__ fixnum.s > $${name}.s; \
  48. !     $(CC) -c $${name}.s; \
  49. !     rm -f $${name}.s;\
  50. !     done
  51. !     touch fixnumMade
  52.   
  53.   _addsf3.o _negsf2.o _subsf3.o _cmpsf2.o _mulsf3.o _divsf3.o : sflonumMade
  54.   sflonumMade : sflonum.s
  55. --- 135,141 ----
  56.       $(CC) -O -DATARI_ST -c atof.c -DNDEBUG \
  57.         -fomit-frame-pointer  -fcombine-regs -fstrength-reduce
  58.   
  59. ! fixnum.o : fixnum.s
  60.   
  61.   _addsf3.o _negsf2.o _subsf3.o _cmpsf2.o _mulsf3.o _divsf3.o : sflonumMade
  62.   sflonumMade : sflonum.s
  63. *** /tmp/,RCSt1a22974    Thu Aug 31 20:57:48 1989
  64. --- Makefile.32    Thu Aug 31 20:56:14 1989
  65. ***************
  66. *** 52,58 ****
  67.             execlp.o cuserid.o ctermid.o bsearch.o brk2.o mkfifo.o
  68.   
  69.   GNUSUPPORT = \
  70. ! _umulsi3.o _mulsi3.o _udivsi3.o _divsi3.o _umodsi3.o _modsi3.o \
  71.   _addsf3.o _negsf2.o _subsf3.o _cmpsf2.o _mulsf3.o _divsf3.o \
  72.   _divdf3.o _muldf3.o _negdf2.o _adddf3.o _subdf3.o _cmpdf2.o \
  73.   _fixunsdfsi.o _fixunsdfdi.o _fixdfdi.o _floatsidf.o _floatdidf.o \
  74. --- 52,58 ----
  75.             execlp.o cuserid.o ctermid.o bsearch.o brk2.o mkfifo.o
  76.   
  77.   GNUSUPPORT = \
  78. ! fixnum.o \
  79.   _addsf3.o _negsf2.o _subsf3.o _cmpsf2.o _mulsf3.o _divsf3.o \
  80.   _divdf3.o _muldf3.o _negdf2.o _adddf3.o _subdf3.o _cmpdf2.o \
  81.   _fixunsdfsi.o _fixunsdfdi.o _fixdfdi.o _floatsidf.o _floatdidf.o \
  82. ***************
  83. *** 73,82 ****
  84.       rm -f $(O3)
  85.       rm -f $(O4)
  86.       rm -f $(O5)
  87. !     rm -f $(GNUSTUFF) fixnumMade sflonumMade dflonumMade
  88.       rm -f $(SFILES)
  89.       rm -f $(O14)
  90. !     rm -f $(O12) ivfprintf.o
  91.   
  92.   libc32.a: $(O1) $(O2) $(O3) $(O4) $(O5) $(GNUSTUFF) $(O14) $(O12)
  93.       rm -f $@
  94. --- 73,82 ----
  95.       rm -f $(O3)
  96.       rm -f $(O4)
  97.       rm -f $(O5)
  98. !     rm -f $(GNUSTUFF) sflonumMade dflonumMade
  99.       rm -f $(SFILES)
  100.       rm -f $(O14)
  101. !     rm -f $(O12) ivfprintf.o iscanf.o
  102.   
  103.   libc32.a: $(O1) $(O2) $(O3) $(O4) $(O5) $(GNUSTUFF) $(O14) $(O12)
  104.       rm -f $@
  105. ***************
  106. *** 109,125 ****
  107.   stsndrec.s : stsndrec.cpp
  108.   bcopy.o : bcopy.s
  109.   alloca.o : alloca.s
  110. ! _umulsi3.o _mulsi3.o _udivsi3.o _divsi3.o _umodsi3.o _modsi3.o : fixnumMade
  111. ! fixnumMade : fixnum.s
  112. !     for name in _umulsi3 _mulsi3 _udivsi3 _divsi3 _umodsi3 _modsi3 ; \
  113. !     do \
  114. !     echo $${name}; \
  115. !     $(CPP) -P -DL$${name} -D__GNUC__ fixnum.s > $${name}.s; \
  116. !     $(CC) -c $${name}.s; \
  117. !     rm -f $${name}.s;\
  118. !     done
  119. !     touch fixnumMade
  120.   
  121.   _addsf3.o _negsf2.o _subsf3.o _cmpsf2.o _mulsf3.o _divsf3.o : sflonumMade
  122.   sflonumMade : sflonum.s
  123. --- 109,115 ----
  124.   stsndrec.s : stsndrec.cpp
  125.   bcopy.o : bcopy.s
  126.   alloca.o : alloca.s
  127. ! fixnum.o : fixnum.s
  128.   
  129.   _addsf3.o _negsf2.o _subsf3.o _cmpsf2.o _mulsf3.o _divsf3.o : sflonumMade
  130.   sflonumMade : sflonum.s
  131. *** /tmp/,RCSt1a22974    Thu Aug 31 20:57:49 1989
  132. --- PatchLevel.h    Thu Aug 31 20:56:15 1989
  133. ***************
  134. *** 1,5 ****
  135.   /*
  136. !  *    PathLevel: 13
  137.    *
  138.    *    the Patch Level above is to identify the version
  139.    *    of the all the files in this directory. given the above
  140. --- 1,5 ----
  141.   /*
  142. !  *    PathLevel: 14
  143.    *
  144.    *    the Patch Level above is to identify the version
  145.    *    of the all the files in this directory. given the above
  146. *** /tmp/,RCSt1a22974    Thu Aug 31 20:58:34 1989
  147. --- dflonum.c    Thu Aug 31 20:56:24 1989
  148. ***************
  149. *** 52,60 ****
  150.      
  151.      */
  152.   
  153. - #include <stdio.h>
  154. - /* #include <math.h> */
  155.   #include "flonum.h"
  156.   
  157.   #ifdef __GCC_OLD__
  158. --- 52,57 ----
  159. ***************
  160. *** 86,422 ****
  161.   #define dtol __fixdfsi
  162.   #define ltod __floatsidf
  163.   #endif
  164. - #if 0    /* see eprintf.c in minix library */
  165. - #ifdef L_eprintf
  166. - #include <stdio.h>
  167. - /* This is used by the `assert' macro.  */
  168. - void
  169. -     _eprintf (string, line)
  170. - char *string;
  171. - int line;
  172. - {
  173. -     fprintf (stderr, string, line);
  174. - }
  175. - #endif
  176. - #endif
  177.   
  178. ! #ifdef L_umulsi3
  179.   
  180. ! /*_umulsi3 (a, b) unsigned a, b; { return a * b; } */
  181.   
  182. ! unsigned long umultl(a,b)
  183. ! unsigned long a, b;
  184. ! {
  185. !     register unsigned long d7, d6, d5, d4;
  186. !     
  187. !     d7 = a;
  188. !     d6 = b;
  189. !     d5 = d6;
  190. !     d4 = d6;
  191. !     /* without the next line, gcc may core dump. Gcc sometimes
  192. !        gets confused if you have too many registers */
  193. !     
  194. !     &a; &b;
  195. !     
  196. !     /*printf("a %u b %u\n", a, b);*/
  197. !     
  198. !     /* low word */
  199. !     MUL(d7, d6);
  200. !     SWAP(d5);
  201. !     MUL(d7, d5);
  202. !     SWAP(d7);
  203. !     MUL(d7, d4);
  204. !     d4 += d5;
  205. !     SWAP(d4);
  206. !     d4 &= 0xFFFF0000;
  207. !     d4 += d6;
  208. !     return(d4);
  209. ! }
  210. ! #endif
  211. ! #ifdef L_mulsi3
  212. ! /* _mulsi3 (a, b) int a, b; { return a * b; } */
  213. ! long multl(a, b)
  214. ! long a, b;
  215. ! {
  216. !     int sign = 0;
  217. !     long umultl();
  218. !     if ((a ^ b) < 0) sign = 1;
  219. !     if (a < 0) a = -a;
  220. !     if (b < 0) b = -b;
  221. !     /*printf("a is %d b is %d\n", a, b);*/
  222. !     if (sign) return(- umultl(a,b));
  223. !     else return(umultl(a,b));
  224. ! }
  225.   #endif
  226. ! #ifdef L_udivsi3
  227. ! /*_udivsi3 (a, b) unsigned a, b; { return a / b; } */
  228. ! /*
  229. !   this routine based on one in the PD forth package for the sun by Mitch Bradley
  230. !   */
  231. ! unsigned udivl(u, v)
  232. ! register unsigned long u, v;
  233. ! {
  234. !     register unsigned short um, ul, vm, vl;
  235. !     unsigned long ans;
  236. !     unsigned long u1, v1;
  237. !     long i;
  238. !     long rem;
  239. !     
  240. !     if (v == 0) {
  241. !     /* should cause an exception condition */
  242. !     DIV(u, v);
  243. !     fprintf(stderr, "division by zero\n");
  244. !     }
  245. !     if (v > u) return(0);
  246. !     
  247. !     ul = u; SWAP(u); um = u;
  248. !     vl = v; SWAP(v); vm = v;
  249. !     if (vm == 0) {
  250. !     u = vl; v = um;
  251. !     DIV(u, v);
  252. !     /* note -- if you delete the next line, gcc goes into
  253. !        an infinite loop */
  254. !     if (vm) printf("result is %d\n", v);
  255. !     vm = v & 0xFFFF; /* dividend is in low word */
  256. !     v &= 0xFFFF0000; /* remainder is in high word */
  257. !     v += ul;
  258. !     DIV(vl, v);
  259. !     v &= 0xFFFF; /* dividend is in low word */
  260. !     u = vm;
  261. !     SWAP(u);
  262. !     return(v + u);
  263. !     /*ans = ((um / vl) << 16) + ((((um % vl) << 16) + ul) / vl);
  264. !       return(ans);*/
  265. !     }
  266. !     
  267. !     if (vl == 0) return(um / vm);
  268. !     SWAP(u); SWAP(v);
  269. !     if ( (u >> 3) < v) {
  270. !     for(i = 0; u >= v; i++, u -= v);
  271. !     /*printf("lt 8\n");*/
  272. !     return(i);
  273. !     }
  274. !     u1 = u; v1 = v;
  275. !     
  276. !     /* scale divisor */
  277. !     v1--;
  278. !     for(i = 0; ((unsigned) v1) >= 0xFFFF; v1 >>= 1, i++);
  279. !     if (++v1 > 0xFFFF) {
  280. !     i++; v1 >>=1;
  281. !     }
  282. !     u1 >>= i;
  283. !     /*printf("i is %d, u1 is %x, v1 is %x\n", i, u1, v1);*/
  284. !     ans = u1 / v1;
  285. !     rem = u - (ans * v);
  286. !     if (rem > v) {ans++; rem -= v; }
  287. !     if (rem > v) {printf("oops\n");}
  288. !     return(ans);
  289. ! }
  290. ! #endif
  291. ! #ifdef L_divsi3
  292. ! long divl(a, b)
  293. ! long a, b;
  294. ! {
  295. !     int sign = 0;
  296. !     if ((a ^ b) < 0) sign = 1;
  297. !     if (a < 0) a = -a;
  298. !     if (b < 0) b = -b;
  299. !     if (sign) return(-udivl(a,b));
  300. !     else return(udivl(a,b));
  301. ! }
  302. ! #endif
  303. ! #ifdef L_umodsi3
  304. ! #ifdef __GCC_OLD__
  305. ! _umodsi3 (a, b)
  306. ! #else
  307. ! __umodsi3 (a, b)
  308. ! #endif
  309. ! unsigned a, b;
  310. ! {
  311. !     /*return a % b;*/
  312. !     return (a - ((a/b)*b));
  313. ! }
  314. ! #endif
  315. ! #ifdef L_modsi3
  316. ! #ifdef __GCC_OLD__
  317. ! _modsi3 (a, b)
  318. ! #else
  319. ! __modsi3 (a, b)
  320. ! #endif
  321. ! int a, b;
  322. ! {
  323. !     /*return a % b;*/
  324. !     return( a - ((a/b) * b));
  325. ! }
  326. ! #endif
  327. ! #ifdef L_lshrsi3
  328. ! #ifdef __GCC_OLD__
  329. ! _lshrsi3 (a, b)
  330. ! #else
  331. ! __lshrsi3 (a, b)
  332. ! #endif
  333. ! unsigned a, b;
  334. ! {
  335. !     return a >> b;
  336. ! }
  337. ! #endif
  338. ! #ifdef L_lshlsi3
  339. ! #ifdef __GCC_OLD__
  340. ! _lshlsi3 (a, b)
  341. ! #else
  342. ! __lshlsi3 (a, b)
  343. ! #endif
  344. ! unsigned a, b;
  345. ! {
  346. !     return a << b;
  347. ! }
  348. ! #endif
  349. ! #ifdef L_ashrsi3
  350. ! #ifdef __GCC_OLD__
  351. ! _ashrsi3 (a, b)
  352. ! #else
  353. ! __ashrsi3 (a, b)
  354. ! #endif
  355. ! int a, b;
  356. ! {
  357. !     return a >> b;
  358. ! }
  359. ! #endif
  360. ! #ifdef L_ashlsi3
  361. ! #ifdef __GCC_OLD__
  362. ! _ashlsi3 (a, b)
  363. ! #else
  364. ! __ashlsi3 (a, b)
  365. ! #endif
  366. ! int a, b;
  367.   {
  368. !     return a << b;
  369. ! }
  370. ! #endif
  371. ! /* this divide stuff is hopelessly broken, in addition to being much
  372. !    more complicated than in needs to be.  The new version's at the
  373. !    end of this file */
  374.   #if 0
  375. ! #ifdef L_divdf3
  376. ! /*double _divdf3 (a, b) double a, b; { return a / b; } */
  377. ! double drecip1(f1)
  378. ! double f1;
  379. ! {
  380. !     struct bitdouble *bdp = &f1;
  381. !     unsigned m1, m2;
  382. !     
  383. !     printf("drecip1(%X)", f1);
  384. !     if (bdp->exp == 0 ) return(0L);
  385. !     if (bdp->mant1 == 0L) {
  386. !     bdp->exp = 0x3ff + 0x3ff - bdp->exp;
  387. !     bdp->mant2 = 0L;
  388. !     return(f1);
  389. !     }
  390. !     bdp->exp = 0x3ff + 0x3ff - bdp->exp - 1;
  391. !     m1 = (0x00100000 + bdp->mant1) >> 5;
  392. !     m2 = (0x80000000 / m1);
  393. !     /*printf("m1 %x m2 %x\n", m1, m2);*/
  394. !     m2 <<= 5;
  395. !     m2 &= 0xFFFFF;
  396. !     /*printf("exp %x mant %x\n", bdp->exp, m2);*/
  397. !     bdp->mant1 = m2;
  398. !     bdp->mant2 = 0L;
  399. !     printf("drecip1->%X\n", f1);
  400. !     return(f1);
  401. ! }
  402. ! double drecip(f)
  403. ! double f;
  404. ! {
  405. !     struct bitdouble *bdp;
  406. !     double quotient, remainder;
  407.       
  408. !     printf("drecip(%X)", f);
  409. !     quotient = drecip1(f);
  410. !     remainder = /* 1.0 */ ((double)one) - quotient * f;
  411. !     bdp = &remainder;
  412. !     for(; bdp->exp > 0x3ca; ) {
  413. !     printf("drc: exp=%X ", bdp->exp);
  414. !     remainder = /* 1.0 */ ((double)one) - (quotient*f);
  415. !     printf("rem=%X ", remainder);
  416. !     quotient = quotient + (drecip1(f)*remainder);
  417. !     }
  418. !     printf("drecip->%X\n", quotient);
  419. !     return(quotient);
  420. ! }
  421.   
  422.   
  423. ! double ddiv(f1, f2)
  424. ! double f1, f2;
  425. ! {
  426. !     return(f1 * drecip(f2));
  427.   }
  428.   #endif
  429. - #endif            /* commented out divide routines */
  430.   
  431.   #ifdef L_muldf3
  432.   /*double _muldf3 (a, b) double a, b; { return a * b; } */
  433.   
  434. - #ifdef SLOW_KLUDGEY_QMULT
  435. - __qmult(m11, m12, m21, m22, p1, p2)
  436. - unsigned long m11, m12, m21, m22, *p1, *p2;
  437. - {
  438. - /*    register unsigned long d2 = m11; */
  439. -     register long d2 = m11;
  440. -     register unsigned long d3 = m12, d4 = m21, d5 = m22, d6 =0, d7 = 0;
  441. -     int i;
  442. -     /* guess what happens if you delete the next line.... */
  443. -     /*    &i; */
  444. -     for (i = 0; i < 11; i++) ASL2(d2, d3);
  445. -     for (i = 0; i < 9; i++) ASL2(d4, d5);
  446. -     
  447. -     for (i = 0; i < 64; i++) {
  448. -     if (d2 < 0) { ADD2(d4, d5, d6, d7);}
  449. -     ASL2(d2, d3);
  450. -     ASR2(d4, d5);
  451. -     }
  452. -     d2 = d6;
  453. -     d3 = d7;
  454. -     for (i = 0; i < 9; i++) ASR2(d2, d3);
  455. -     *p1 = d2; *p2 = d3;
  456. - }
  457. - #else
  458. - /* new qmult */
  459.   /* a set of totally local kludges, for summing partial results into
  460.      result vector */
  461.   
  462. ! /* 
  463. ! #define XADDL(partial, target_ptr) \
  464. !     { register unsigned long temp = *target_ptr; \
  465. !     asm volatile("addl %2,%0" : "=d" (temp) : "0" (temp), "g" (partial)); \
  466. !     *target_ptr-- = temp; temp = *target_ptr; \
  467. !     asm volatile("addxl #0,%0" : "=d" (temp) : "0" (temp)); \
  468. !     *target_ptr = temp; }
  469. ! */
  470. ! static long constant_zero_kludge = 0;
  471.   #define XXADDL(partial, target) \
  472.       { register unsigned long * zero = &constant_zero_kludge + 1; \
  473.         asm volatile("addl  %3,%0@;\
  474. --- 83,222 ----
  475.   #define dtol __fixdfsi
  476.   #define ltod __floatsidf
  477.   #endif
  478.   
  479. ! #ifdef L_divdf3
  480.   
  481. ! /* new double-float divide routine, by jrd */
  482. ! /* thanks jrd !! */
  483.   
  484. ! #ifdef __GCC_OLD__
  485. ! double _divdf3(num, denom)
  486. ! #else
  487. ! double __divdf3(num, denom)
  488.   #endif
  489. ! double num, denom;
  490.   {
  491. !     double local_num = num;
  492. !     double local_denom = denom;
  493. !     struct bitdouble * num_bdp = (struct bitdouble *)(&local_num);
  494. !     struct bitdouble * den_bdp = (struct bitdouble *)(&local_denom);
  495. !     short num_exp = num_bdp->exp,
  496. !           den_exp = den_bdp->exp;
  497. !     short result_sign = 0;
  498. !     /*  register */ unsigned long num_m1, num_m2, num_m3, num_m4;
  499. !     register unsigned long den_m1, den_m2, den_m3, den_m4;
  500. !     unsigned long result_mant[3];
  501. !     unsigned long result_mask;
  502. !     short result_idx;
  503. !     
  504. !     if ((num_exp == 0) || (den_exp == 0)) /* zzz should really cause trap */
  505. !       return(0.0);
  506. !     
  507. !     /* deal with signs */
  508. !     result_sign = result_sign + num_bdp->sign - den_bdp->sign;
  509. !     
  510. !     /* unpack the numbers */
  511. !     num_m1 = num_bdp->mant1 | 0x00100000;        /* hidden bit */
  512. !     num_m2 = num_bdp->mant2;
  513. !     num_m4 = num_m3 = 0;
  514. !     den_m1 = den_bdp->mant1 | 0x00100000;        /* hidden bit */
  515. !     den_m2 = den_bdp->mant2;
  516. !     den_m4 = den_m3 = 0;
  517. !     
  518.   #if 0
  519. !     /* buy a little extra accuracy by shifting num and denum up 10 bits */
  520. !     for (result_idx /* loop counter */ = 0 ; result_idx < 10 ; result_idx++)
  521. !     {
  522. !     ASL3(num_m1, num_m2, num_m3);
  523. !     ASL3(den_m1, den_m2, den_m3);
  524. !     }
  525. ! #endif
  526.       
  527. !     /* hot wire result mask and index */
  528. !     result_mask = 0x00100000;            /* start at top mantissa bit */
  529. !     result_idx = 0;                /* of first word */
  530. !     result_mant[0] = 0;
  531. !     result_mant[1] = 0;
  532. !     result_mant[2] = 0;
  533. !     
  534. !     /* if denom is greater than num here, shift denom right one and dec num expt */
  535. !     if (den_m1 < num_m1)
  536. !       goto kludge1;                /* C is assembly language,
  537. !                            remember? */
  538. !     if (den_m1 > num_m1)
  539. !       goto kludge0;
  540. !     if (den_m2 <= num_m2)                /* first word eq, try 2nd */
  541. !       goto kludge1;
  542. !     
  543. !   kludge0:
  544. !     
  545. !     num_exp--;
  546. !     ASR4(den_m1, den_m2, den_m3, den_m4);
  547. !     
  548. !   kludge1:
  549. !     
  550. !     for ( ; !((result_idx == 2) && (result_mask & 0x40000000)) ; )
  551. !     {
  552. !     /* if num >= den, subtract den from num and set bit in result */
  553. !     if (num_m1 > den_m1) goto kludge2;
  554. !     if (num_m1 < den_m1) goto kludge3;
  555. !     if (num_m2 > den_m2) goto kludge2;
  556. !     if (num_m2 < den_m2) goto kludge3;
  557. !     if (num_m3 > den_m3) goto kludge2;
  558. !     if (num_m3 < den_m3) goto kludge3;
  559. !     if (num_m4 < den_m4) goto kludge3;
  560. !     
  561. !       kludge2:
  562. !     result_mant[result_idx] |= result_mask;
  563. !     SUB4(den_m1, den_m2, den_m3, den_m4, num_m1, num_m2, num_m3, num_m4);
  564. !       kludge3:
  565. !     ASR4(den_m1, den_m2, den_m3, den_m4);
  566. !     result_mask >>= 1;
  567. !     if (result_mask == 0)        /* next word? */
  568. !     {
  569. !         result_mask = 0x80000000;
  570. !         result_idx++;
  571. !     }
  572. !     }
  573. ! /* stick in last half-bit if necessary */
  574. !   if (result_mant[2])
  575. !     {
  576. !     den_m1 = 0;        /* handy register */
  577. !     den_m2 = 1;
  578. ! /* busted
  579. !     ADD2(den_m1, den_m2, result_mant[0], result_mant[1]);
  580. ! */
  581. !     result_mant[1]++;
  582. !     if (result_mant[1] == 0)
  583. !         result_mant[0]++;
  584.   
  585. +     if (result_mant[0] & 0x00200000)    /* overflow? */
  586. +         {
  587. +         num_exp--;
  588. +         }
  589. +     }
  590. +   /* compute the resultant exponent */
  591. +   num_exp = num_exp - den_exp + 0x3FF;
  592.   
  593. !   /* reconstruct the result in local_num */
  594. !   num_bdp->sign = result_sign;
  595. !   num_bdp->exp = num_exp;
  596. !   num_bdp->mant1 = result_mant[0] & 0xFFFFF;
  597. !   num_bdp->mant2 = result_mant[1];
  598. !   
  599. !   /* done! */
  600. !   return(local_num);
  601.   }
  602.   #endif
  603.   
  604.   #ifdef L_muldf3
  605.   /*double _muldf3 (a, b) double a, b; { return a * b; } */
  606.   
  607.   /* a set of totally local kludges, for summing partial results into
  608.      result vector */
  609.   
  610. ! static unsigned long constant_zero_kludge = 0;
  611.   #define XXADDL(partial, target) \
  612.       { register unsigned long * zero = &constant_zero_kludge + 1; \
  613.         asm volatile("addl  %3,%0@;\
  614. ***************
  615. *** 425,452 ****
  616.               : "0" (target), "g" (partial), "1" (zero)); \
  617.       }
  618.   
  619. - /*
  620. - #define ADDL(partial, target_ptr) \
  621. -     { register unsigned long temp = *target_ptr; \
  622. -     asm volatile("addl %2,%0" : "=d" (temp) : "0" (temp), "g" (partial)); \
  623. -     *target_ptr-- = temp }
  624. - #define ADDXL(partial, target_ptr) \
  625. -     { register unsigned long temp = *target_ptr; \
  626. -     asm volatile("addxl %2,%0" : "=d" (temp) : "0" (temp), "g" (partial)); \
  627. -     *target_ptr-- = temp }
  628. -     
  629. - #define ADDW(partial, target_ptr) \
  630. -     { register unsigned short temp = *(unsigned short * )target_ptr; \
  631. -     asm volatile("addw %2,%0" : "=d" (temp) : "0" (temp), "g" (partial)); \
  632. -     *(unsigned short * )target_ptr-- = temp }
  633. - #define ADDXW(partial, target_ptr) \
  634. -     { register unsigned sort temp = *(unsigned short * )target_ptr; \
  635. -     asm volatile("addxw %2,%0" : "=d" (temp) : "0" (temp), "g" (partial)); \
  636. -     *(unsigned short * )target_ptr-- = temp }
  637. - */    
  638.   static char component_index[] = 
  639.       {
  640.       3, 3,                /* last ones */
  641. --- 225,230 ----
  642. ***************
  643. *** 526,533 ****
  644.     *result_hi = res1;
  645.     *result_lo = res2;
  646.   }
  647. - #endif
  648.   
  649.   double dmult(f1, f2)
  650.   double f1, f2;
  651. --- 304,309 ----
  652. ***************
  653. *** 545,553 ****
  654.       /* check for zero */
  655.       if (! exp1) return(0.0);
  656.       if (! exp2) return(0.0);
  657. !     d2 = 0x00100000 + bdp1->mant1;
  658.       d3 = bdp1->mant2;
  659. !     d4 = 0x00100000 + bdp2->mant1;
  660.       d5 = bdp2->mant2;
  661.       __qmult(d2, d3, d4, d5, &p1, &p2);
  662.       d6 = p1; d7 = p2;
  663. --- 321,329 ----
  664.       /* check for zero */
  665.       if (! exp1) return(0.0);
  666.       if (! exp2) return(0.0);
  667. !     d2 = 0x00100000 | bdp1->mant1;
  668.       d3 = bdp1->mant2;
  669. !     d4 = 0x00100000 | bdp2->mant1;
  670.       d5 = bdp2->mant2;
  671.       __qmult(d2, d3, d4, d5, &p1, &p2);
  672.       d6 = p1; d7 = p2;
  673. ***************
  674. *** 605,614 ****
  675.       howmuch = exp1 - exp2;
  676.       if (howmuch > 53) return(f1);
  677.       
  678. !     d7 = bdp2->mant1 + 0x00100000;
  679.       d6 = bdp2->mant2;
  680.       
  681. !     d5 = bdp1->mant1 + 0x00100000;
  682.       d4 = bdp1->mant2;
  683.       
  684.       for (temp = 0; temp < howmuch; temp++) ASR2(d7, d6);
  685. --- 381,390 ----
  686.       howmuch = exp1 - exp2;
  687.       if (howmuch > 53) return(f1);
  688.       
  689. !     d7 = bdp2->mant1 | 0x00100000;
  690.       d6 = bdp2->mant2;
  691.       
  692. !     d5 = bdp1->mant1 | 0x00100000;
  693.       d4 = bdp1->mant2;
  694.       
  695.       for (temp = 0; temp < howmuch; temp++) ASR2(d7, d6);
  696. ***************
  697. *** 700,707 ****
  698.   #ifdef L_fixunsdfsi
  699.   /*_fixunsdfsi (a) double a; { return (unsigned int) a; } */
  700.   
  701. - /* #ifdef L_fixdfsi _fixdfsi (a) double a; { return (int) a; } #endif */
  702.   unsigned long dtoul(f)
  703.   double f;
  704.   {
  705. --- 476,481 ----
  706. ***************
  707. *** 710,716 ****
  708.       bdp = (struct bitdouble *)&f;
  709.       si = bdp->sign;
  710.       ex = bdp->exp;
  711. !     mant1 = bdp->mant1 + 0x00100000;
  712.       mant2 = bdp->mant2;
  713.       
  714.       /* zero value */
  715. --- 484,490 ----
  716.       bdp = (struct bitdouble *)&f;
  717.       si = bdp->sign;
  718.       ex = bdp->exp;
  719. !     mant1 = bdp->mant1 | 0x00100000;
  720.       mant2 = bdp->mant2;
  721.       
  722.       /* zero value */
  723. ***************
  724. *** 744,750 ****
  725.     u.i[LOW] = (unsigned int) a; u.i[HIGH] = 0; return u.d; } */
  726.   #endif
  727.   
  728.   #ifdef L_fixdfdi
  729.   double
  730.   #ifdef __GCC_OLD__
  731. --- 518,523 ----
  732. ***************
  733. *** 808,878 ****
  734.   }
  735.   #endif
  736.   
  737. - #ifdef L_addsf3
  738. - SFVALUE
  739. -     _addsf3 (a, b)
  740. - union flt_or_int a, b;
  741. - {
  742. -     union flt_or_int intify; return INTIFY ((double) a.f + (double) b.f);
  743. - }
  744. - #endif
  745. - #ifdef L_negsf2
  746. - SFVALUE
  747. -     _negsf2 (a)
  748. - union flt_or_int a;
  749. - {
  750. -     union flt_or_int intify;
  751. -     return INTIFY (-((double) a.f));
  752. - }
  753. - #endif
  754. - #ifdef L_subsf3
  755. - SFVALUE
  756. -     _subsf3 (a, b)
  757. - union flt_or_int a, b;
  758. - {
  759. -     union flt_or_int intify;
  760. -     return INTIFY (((double) a.f - (double) b.f));
  761. - }
  762. - #endif
  763. - #ifdef L_cmpsf2
  764. - SFVALUE
  765. -     _cmpsf2 (a, b)
  766. - union flt_or_int a, b;
  767. - {
  768. -     union flt_or_int intify;
  769. -     double a1, b1;
  770. -     a1 = a.f; b1 = b.f;
  771. -     if ( a1 > b1)
  772. -     return 1;
  773. -     else if (a1 < b1)
  774. -     return -1;
  775. -     return 0;
  776. - }
  777. - #endif
  778. - #ifdef L_mulsf3
  779. - SFVALUE
  780. -     _mulsf3 (a, b)
  781. - union flt_or_int a, b;
  782. - {
  783. -     union flt_or_int intify;
  784. -     return INTIFY (((double) a.f * (double) b.f));
  785. - }
  786. - #endif
  787. - #ifdef L_divsf3
  788. - SFVALUE
  789. -     _divsf3 (a, b)
  790. - union flt_or_int a, b;
  791. - {
  792. -     union flt_or_int intify;
  793. -     return INTIFY (((double) a.f / (double) b.f));
  794. - }
  795. - #endif
  796.   #ifdef L_truncdfsf2
  797.   float __dtof(d)
  798.   double d;
  799. --- 581,586 ----
  800. ***************
  801. *** 933,1063 ****
  802.       union flt_or_int intify;
  803.       double retval;
  804.       return (__ftod(a));
  805. - }
  806. - #endif
  807. - #ifdef L_divdf3
  808. - /* new double-float divide routine, by jrd */
  809. - /* thanks jrd !! */
  810. - #ifdef __GCC_OLD__
  811. - double _divdf3(num, denom)
  812. - #else
  813. - double __divdf3(num, denom)
  814. - #endif
  815. - double num, denom;
  816. - {
  817. -     double local_num = num;
  818. -     double local_denom = denom;
  819. -     struct bitdouble * num_bdp = (struct bitdouble *)(&local_num);
  820. -     struct bitdouble * den_bdp = (struct bitdouble *)(&local_denom);
  821. -     short num_exp = num_bdp->exp,
  822. -           den_exp = den_bdp->exp;
  823. -     short result_sign = 0;
  824. -     /*  register */ unsigned long num_m1, num_m2, num_m3, num_m4;
  825. -     register unsigned long den_m1, den_m2, den_m3, den_m4;
  826. -     unsigned long result_mant[3];
  827. -     unsigned long result_mask;
  828. -     short result_idx;
  829. -     
  830. -     if ((num_exp == 0) || (den_exp == 0))        /* zzz should really cause trap */
  831. -       return(0.0);
  832. -     
  833. -     /* deal with signs */
  834. -     result_sign = result_sign + num_bdp->sign - den_bdp->sign;
  835. -     
  836. -     /* unpack the numbers */
  837. -     num_m1 = num_bdp->mant1 | 0x00100000;        /* hidden bit */
  838. -     num_m2 = num_bdp->mant2;
  839. -     num_m4 = num_m3 = 0;
  840. -     den_m1 = den_bdp->mant1 | 0x00100000;        /* hidden bit */
  841. -     den_m2 = den_bdp->mant2;
  842. -     den_m4 = den_m3 = 0;
  843. -     
  844. - #if 0
  845. -     /* buy a little extra accuracy by shifting num and denum up 10 bits */
  846. -     for (result_idx /* loop counter */ = 0 ; result_idx < 10 ; result_idx++)
  847. -     {
  848. -     ASL3(num_m1, num_m2, num_m3);
  849. -     ASL3(den_m1, den_m2, den_m3);
  850. -     }
  851. - #endif
  852. -     
  853. -     /* hot wire result mask and index */
  854. -     result_mask = 0x00100000;            /* start at top mantissa bit */
  855. -     result_idx = 0;                /* of first word */
  856. -     result_mant[0] = 0;
  857. -     result_mant[1] = 0;
  858. -     result_mant[2] = 0;
  859. -     
  860. -     /* if denom is greater than num here, shift denom right one and dec num expt */
  861. -     if (den_m1 < num_m1)
  862. -       goto kludge1;                /* C is assembly language,
  863. -                            remember? */
  864. -     if (den_m1 > num_m1)
  865. -       goto kludge0;
  866. -     if (den_m2 <= num_m2)                /* first word eq, try 2nd */
  867. -       goto kludge1;
  868. -     
  869. -   kludge0:
  870. -     
  871. -     num_exp--;
  872. -     ASR4(den_m1, den_m2, den_m3, den_m4);
  873. -     
  874. -   kludge1:
  875. -     
  876. -     for ( ; !((result_idx == 2) && (result_mask & 0x40000000)) ; )
  877. -     {
  878. -     /* if num >= den, subtract den from num and set bit in result */
  879. -     if (num_m1 > den_m1) goto kludge2;
  880. -     if (num_m1 < den_m1) goto kludge3;
  881. -     if (num_m2 > den_m2) goto kludge2;
  882. -     if (num_m2 < den_m2) goto kludge3;
  883. -     if (num_m3 > den_m3) goto kludge2;
  884. -     if (num_m3 < den_m3) goto kludge3;
  885. -     if (num_m4 < den_m4) goto kludge3;
  886. -     
  887. -       kludge2:
  888. -     result_mant[result_idx] |= result_mask;
  889. -     SUB4(den_m1, den_m2, den_m3, den_m4, num_m1, num_m2, num_m3, num_m4);
  890. -       kludge3:
  891. -     ASR4(den_m1, den_m2, den_m3, den_m4);
  892. -     result_mask >>= 1;
  893. -     if (result_mask == 0)        /* next word? */
  894. -     {
  895. -         result_mask = 0x80000000;
  896. -         result_idx++;
  897. -     }
  898. -     }
  899. - /* stick in last half-bit if necessary */
  900. -   if (result_mant[2])
  901. -     {
  902. -     den_m1 = 0;        /* handy register */
  903. -     den_m2 = 1;
  904. - /* busted
  905. -     ADD2(den_m1, den_m2, result_mant[0], result_mant[1]);
  906. - */
  907. -     result_mant[1]++;
  908. -     if (result_mant[1] == 0)
  909. -         result_mant[0]++;
  910. -     if (result_mant[0] & 0x00200000)    /* overflow? */
  911. -         {
  912. -         num_exp--;
  913. -         }
  914. -     }
  915. -   /* compute the resultant exponent */
  916. -   num_exp = num_exp - den_exp + 0x3FF;
  917. -   /* reconstruct the result in local_num */
  918. -   num_bdp->sign = result_sign;
  919. -   num_bdp->exp = num_exp;
  920. -   num_bdp->mant1 = result_mant[0] & 0xFFFFF;
  921. -   num_bdp->mant2 = result_mant[1];
  922. -   
  923. -   /* done! */
  924. -   return(local_num);
  925.   }
  926.   #endif
  927. --- 641,645 ----
  928. *** /tmp/,RCSt1a22974    Thu Aug 31 21:02:29 1989
  929. --- vfprintf.c    Thu Aug 31 20:57:09 1989
  930. ***************
  931. *** 44,49 ****
  932. --- 44,51 ----
  933.       _ulong = flags&LONGINT ? va_arg(argp, long) : \
  934.           flags&SHORTINT ? va_arg(argp, short) : va_arg(argp, int);
  935.   
  936. + #define TEN_MUL(X)    ((((X) << 2) + (X)) << 1)
  937.   #define    todigit(c)    ((c) - '0')
  938.   #define    tochar(n)    ((n) + '0')
  939.   
  940. ***************
  941. *** 146,152 ****
  942.               else {
  943.                   n = 0;
  944.                   while (isascii(*fmt) && isdigit(*fmt))
  945. !                     n = 10 * n + todigit(*fmt++);
  946.                   --fmt;
  947.               }
  948.               prec = n < 0 ? -1 : n;
  949. --- 148,154 ----
  950.               else {
  951.                   n = 0;
  952.                   while (isascii(*fmt) && isdigit(*fmt))
  953. !                     n = TEN_MUL(n) + todigit(*fmt++);
  954.                   --fmt;
  955.               }
  956.               prec = n < 0 ? -1 : n;
  957. ***************
  958. *** 163,169 ****
  959.           case '5': case '6': case '7': case '8': case '9':
  960.               n = 0;
  961.               do {
  962. !                 n = 10 * n + todigit(*fmt);
  963.               } while (isascii(*++fmt) && isdigit(*fmt));
  964.               width = n;
  965.               --fmt;
  966. --- 165,171 ----
  967.           case '5': case '6': case '7': case '8': case '9':
  968.               n = 0;
  969.               do {
  970. !                 n = TEN_MUL(n) + todigit(*fmt);
  971.               } while (isascii(*++fmt) && isdigit(*fmt));
  972.               width = n;
  973.               --fmt;
  974.